/****************************************************************************
 * buzzer.c
 *
 * 	 Copyright (C) Hiklife. All rights reserved.
 *   Author: Lgx <lgx@hiklife.com>	2019-03
 * 
 *  蜂鸣器相关函数
 *
 ****************************************************************************/

#include "main.h"


/***************************************************************/
static u8 buzz_step;

#if MUSIC_BUZZ	//音乐蜂鸣器
static TONE_t crom * pTone;

/****************************************
 * 函数名：	music_buzz_gpio_init 
 * 说明：	音乐蜂鸣器引脚配置
 * 输入：	--
 * 输出：	--
 ****************************************/

void music_buzz_gpio_init(void)
{
	GPIO_InitSettingType x;
	x.Signal = GPIO_Pin_Signal_Digital; 
	x.Dir = GPIO_Direction_Output;      
	x.Func = GPIO_Reuse_Func3;          
	x.ODE = GPIO_ODE_Output_Disable;    
	x.DS = GPIO_DS_Output_Normal;       
	x.PUE = GPIO_PUE_Input_Disable;    
	x.PDE = GPIO_PDE_Input_Disable;     
	GPIO_Init(BUZZ_FRQ_PIN, &x);	//频率	
}
/****************************************
 * 函数名：	music_buzz_PwrOn 
 * 说明：	音乐蜂鸣器电源开关
 * 输入：	--
 * 输出：	--
 ****************************************/
void music_buzz_PwrOn(void)
{
	GPIO_WriteBit(BUZZ_PWR_PIN, 1);
}

void music_buzz_PwrOff(void)
{
	GPIO_WriteBit(BUZZ_PWR_PIN, 0);
}

/****************************************
 * 函数名：	music_buzz_FrqOff
 * 说明：	音乐蜂鸣器频率输出关
 * 输入：	--
 * 输出：	--
 ****************************************/
void music_buzz_FrqOff(void)
{
	GPIO->BUZC.Word = 0;
	GPIO->BUZC.BUZEN = 0;
	GPIO_WriteBit(BUZZ_FRQ_PIN, 0);	
	
}

/****************************************
 * 函数名：	music_buzz_SetFreq
 * 说明：	音乐蜂鸣器频率输出设置
 * 输入：	u8 PWM频率/音调频率
 * 			Fpwm 	=   Fsys / PWM分频
 * 			PWM 周期: 	Fpwm / F (目标频率)
 * 输出：	无
 *			Fbuz = Fpclk/2*(BUZ_LOAD + 1)
 ****************************************/
void music_buzz_SetFreq(u16 f)
{	
	GPIO->BUZC.BUZEN = 1;	
	GPIO->BUZC.BUZ_LOAD = PWM_FREQ/(2*f)-1;
}

/* crom tone_freq_tbl[] = 
{
//   C7,  CS7,   D7,  DS7,   E7,   F7,  FS7,   G7,  GS7,   A7,  AS7,    B7  
//    1,   #1,    2,   #2,    3,    4,   #4,    5,   #5,    6,   #6,   ##1  
	2093, 2217, 2349, 2489, 2637, 2794, 2960, 3136, 3322, 3520, 3729, 3951
}; */

// #define TONE_DO	 	2093		//179。  TONE_t 中频率是u8, 必须小于256。
// #define TONE_SDO	2217
// #define TONE_RA	 	2349
// #define TONE_SRA	2489
// #define TONE_MI	 	2637
// #define TONE_FA	 	2794
// #define TONE_SFA	2960
// #define TONE_SO	 	3136
// #define TONE_SSO	3322
// #define TONE_LA		3520
// #define TONE_SLA	3729
// #define TONE_SSDO	3951		//94.9

#define TONE_DOO	2000//PWM_FREQ/20		//357
#define TONE_DO	 	2093//PWM_FREQ/21		//357
#define TONE_SDO	2217//PWM_FREQ/22		//340
#define TONE_RA	 	2349//PWM_FREQ/23
#define TONE_SRA	2489//PWM_FREQ/25
#define TONE_MI	 	2637//PWM_FREQ/26
#define TONE_FA	 	2794//PWM_FREQ/28
#define TONE_SFA	2960//PWM_FREQ/30
#define TONE_SO	 	3136//PWM_FREQ/31
#define TONE_SSO	3322//PWM_FREQ/33
#define TONE_LA		3520//PWM_FREQ/35
#define TONE_SLA	3729//PWM_FREQ/37
#define TONE_SSDO	3951//PWM_FREQ/40		//187
#define TONE_RAA	2400//PWM_FREQ/24
#define TONE_MIA	2700//PWM_FREQ/27

crom TONE_t Tone1[] = {{TONE_DO,   28, 10},{TONE_DOO,   200, 8},  {FREQ_NO,   0, 0}};//{{TONE_MI,   10, 20}, {FREQ_NO,   0, 0}};	
// crom TONE_t Tone2[] = {{TONE_DO,   20, 10}, {TONE_RA,  20, 20},{TONE_MI,  40, 20},{FREQ_NO, 0, 0}};//开机和弦音
// crom TONE_t Tone3[] = {{TONE_MI,   20, 10}, {TONE_RA,  20, 20},{TONE_DO,  40, 20},{FREQ_NO, 0, 0}};//关机和弦音
// crom TONE_t Tone4[] = {{TONE_SRA,  10,  5}, {TONE_SRA, 10,  5},{TONE_SRA, 10,  5},{FREQ_NO, 0, 0}};
crom TONE_t Tone5[] = {{TONE_RA,  250, 40}, {FREQ_NO, 0, 0}};//{{TONE_SRA,  20, 10}, {TONE_SRA, 20, 10},{FREQ_NO, 0, 0}};
crom TONE_t Tone6[] = {{TONE_SRA,  12, 4}, {TONE_SRA,  12, 4},{TONE_SRA,  12, 4},{FREQ_NO, 0, 0}};//{{TONE_MI,   10, 10}, {TONE_MI,  10, 10},{TONE_MI,  10, 10},{FREQ_NO, 0, 0}};//{{TONE_RA,   60, 20}, {TONE_RA,  60, 20},{TONE_RA,  60, 20},{FREQ_NO, 0, 0}};
//crom TONE_t Tone7[] = {{TONE_SDO,  30, 10}, {TONE_RA,  20, 20},{TONE_MI,  60, 20},{FREQ_NO, 0, 0}};//上电

/****************************************
 * 函数名：	music_buzz_start
 * 说明：	音乐蜂鸣器启动输出
 * 输入：	声音类型索引
 * 输出：	--
 ****************************************/ 
void music_buzz_start(u8 type)
{
	switch (type)
	{
	case BUZ_KEY:
		pTone = Tone1;
		break;	
	case BUZ_USELESS:
		pTone = Tone6;
		break;					
	case BUZ_ERR:
		pTone = Tone5;
		break;			
/*   	case BUZ_MACHOFF:
		pTone = Tone3;
		break;
	
	case BUZ_WARN:
		pTone = Tone4;
		break;			
	
	case BUZ_FINISH:
		pTone = Tone7;
		break;
	case BUZ_MACHON:
		pTone = Tone2;
		break;	
	case BUZ_PWRON:
		pTone = Tone7;
		break; */	 
	default:
		pTone = Tone1;
		return;
	}
	
	buzz_step = 0;
}

/****************************************
 * 函数名：	music_buzz_ctrl
 * 说明：	音乐蜂鸣器控制函数 10ms调用一次
 * 输入：	声音类型索引
 * 输出：	--
 ****************************************/ 
void music_buzz_ctrl(void)
{
	static TONE_t Tone;

	switch (buzz_step)
	{
	case 0:
		Tone = *pTone;

		/* Tone.freq == freq_NO */ 			//是结束符
		if ((Tone.freq == FREQ_NO) || (Tone.PWR_time == 0) || ((Tone.PWR_time == 0)))
		{
			buzz_step = 2;
			break;	
		}

		music_buzz_PwrOn();
		music_buzz_SetFreq(Tone.freq);
		buzz_step = 1;
		break;

	case 1:
		if (Tone.PWR_time != 0)
		{
			Tone.PWR_time--;
		}
		else
		{
			music_buzz_PwrOff();
		}

		if (Tone.OSC_time != 0)
		{
			Tone.OSC_time--;
		}
		else
		{
			music_buzz_FrqOff();
			pTone++; 				//取下一个音调
			buzz_step = 0;
		}
		break;

	default:
		music_buzz_PwrOff();
		music_buzz_FrqOff();
		break;
	}
}

/****************************************
 * 函数名：	music_buzz_init
 * 说明：	音乐蜂鸣器初始化函数
 * 输入：	--
 * 输出：	--
 ****************************************/ 
void music_buzz_init(void)
{
	music_buzz_PwrOff();
	music_buzz_FrqOff();
	buzz_step = 5;
}

/***************************************************************/
/***************************************************************/
/***************************************************************/
#else	//普通蜂鸣器
static Buzz_t crom * buzz;

/****************************************
 * 函数名：	BEEP_SetFreq
 * 说明：	普通蜂鸣器频率输出设置
 * 输入：	-- 固定4KHZ
 * 			Fpwm 	=   Fsys / PWM分频
 * 			PWM 周期: 	Fpwm / F (目标频率)
 * 输出：	无
 ****************************************/
void buzz_on(void)
{
	/*
	PWM0PL = LOBYTE(F_4KHZ);
	PWM0PH = HIBYTE(F_4KHZ);
	PWM0DL = LOBYTE(F_4KHZ>>1);
	PWM0DH = HIBYTE(F_4KHZ>>1);
	PWM0CON = bit10000001;			// 1分频
	*/
}

/****************************************
 * 函数名：	BEEP_Off
 * 说明：	普通蜂鸣器频率输出关
 * 输入：	--
 * 输出：	--
 ****************************************/
void buzz_off(void)
{
	/*
	BUZZ_FRQ_PIN = 0;
	PWM0DL = 0;
	PWM0DH = 0;
	PWM0CON = 0;
	*/
}

crom Buzz_t buzz0[] = {{ 30, 10}, {  0, 0}};
crom Buzz_t buzz1[] = {{100, 10}, {  0, 0}};
crom Buzz_t buzz2[] = {{300, 10}, {  0, 0}};
crom Buzz_t buzz3[] = {{500, 10}, {  0, 0}};
crom Buzz_t buzz4[] = {{ 10, 5}, { 10, 5},{ 10, 5},{0, 0}};
crom Buzz_t buzz5[] = {{100, 200},{100, 200},{100, 200},{100, 200},{100, 200},{0, 0}};
crom Buzz_t buzz6[] = {{ 10, 5}, { 10, 5},{0, 0}};

crom Buzz_t * buzz_type[] = {buzz0,buzz1,buzz2,buzz3,buzz4,buzz5,buzz6};

/****************************************
 * 函数名：	normal_buzz_start
 * 说明：	普通蜂鸣器启动输出
 * 输入：	声音类型索引
 * 输出：	--
 ****************************************/ 
void normal_buzz_start(u8 type)
{
 	if (type >= TOTAL_BUZZ_N) type = 0;

	buzz	  = buzz_type[type];
	buzz_step = 0;
}

/****************************************
 * 函数名：	buzzctrl
 * 说明：	普通蜂鸣器控制函数 10ms调用一次
 * 输入：	声音类型索引
 * 输出：	--
 ****************************************/ 
void normal_buzz_ctrl(void)
{
	static Buzz_t Tone;

	switch (buzz_step)
	{
	case 0:
		Tone = *buzz;

		//是结束符
		if ((Tone.on_time == 0) && ((Tone.off_time == 0)))
		{
			buzz_step = 3;
			break;	
		}

		buzz_on();
		buzz_step = 1;
		break;

	case 1:
		if (Tone.on_time != 0)
			Tone.on_time--;
		else
			buzz_step = 2;
		break;
	
	case 2:
		buzz_off();
		if (Tone.off_time != 0)
		{
			Tone.off_time--;
		}
		else
		{
			buzz++; 				//取下一个音调
			buzz_step = 0;
		}
		break;

	default:
		buzz_off();
		break;
	}
}

/****************************************
 * 函数名：	buzz_init
 * 说明：	普通蜂鸣器初始化函数
 * 输入：	--
 * 输出：	--
 ****************************************/ 
void normal_buzz_init(void)
{
	buzz_off();
	buzz_step = 5;
}

#endif

















































